/*
 * Copyright (C) 2012 genzo
 */
package jp.gr.java_conf.genzo.wolrepeater;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

import android.app.Application;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;

/**
 * メインApp.
 */
public class WolRepeaterApp extends Application implements Callback {

    /** アプリケーションのインスタンス. */
    private static WolRepeaterApp mApp = null;

    /** UIスレッド通知用ハンドラ. */
    private final Handler mHandler = new Handler(this);

    /** モデル. */
    private final Model mModel = new Model();

    /**
     * モデル取得.
     * 
     * @return モデル
     */
    public Model getModel() {
        return mModel;
    }

    /**
     * アプリケーションインスタンス取得.
     * 
     * @return アプリケーションのインスタンス
     */
    public static WolRepeaterApp getApp() {
        return mApp;
    }

    /*
     * (非 Javadoc)
     * 
     * @see android.app.Application#onCreate()
     */
    @Override
    public void onCreate() {
        super.onCreate();
        mApp = this;
        getModel().load();

    }

    /**
     * PING.
     */
    public void sendPing() {
        L.d("sendPing");
        boolean modify = false;
        for (MachineInfo item : WolRepeaterApp.getApp().getModel()) {

            try {
                InetAddress addr = InetAddress.getByName(item.getIp());
                boolean result = addr.isReachable(500);

                L.d("ping target=" + item.getIp() + " result=" + result);
                modify |= item.setAlive(result);

            } catch (UnknownHostException e) {
                L.e("ping error", e);
            } catch (IOException e) {
                L.e("ping ioerror", e);
            }
        }

        if (modify) {
            mHandler.sendEmptyMessage(0);
        }
    }

    /*
     * (非 Javadoc)
     * 
     * @see android.os.Handler.Callback#handleMessage(android.os.Message)
     */
    @Override
    public boolean handleMessage(Message msg) {
        getModel().firePropertyChange();
        return true;
    }

}